iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
Modern Web

Vue+Django+MongoDB+Nginx 全端開發系列 第 29

讓網站更安全,不准直接連我的網站 IP

  • 分享至 

  • xImage
  •  

Block direct access by ip

一旦將網站對外,就要開始面對這個險惡的世界每天遭受一堆攻擊,雖然大部分都無關痛癢,幾乎都是機器人在 scan ip 然後在發一些無意義的請求,或者亂試 api,看能不能試出來...,最好是哪麼好試啦,而且加上我們之前在 JWT 篇章講到的 protected point 技術,request 必須帶上有效的 token 才能使用 api,要成功使用我們的後端,難度已經很高了

儘管如此,每天被這樣騷擾,還是很煩。那怎麼辦呢?那我們可以做到擋 ip 直連,client 要使用我們的服務,一定要走 DNS,DNS 本身就是一種保護,在網域供應商這邊應該是要做到一些安全防護,再轉到我們的 server

首先我們進到 nginx/sites-available,打開其中一個網站的設定,然後在原有的網站設定下加入以下內容

server {
    listen 80 default;
    server_name _;
    return 403;
}

server {
    listen 443 ssl default;
    server_name _;
    ssl_certificate      /etc/letsencrypt/live/your_domain_name/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/your_domain_name/privkey.pem;
    return 403;
}

listen 80 default 是說 80 port 預設會先走這,然後 server_name _ 是說 server_name 等於任何 ip,最後 return 403,回 403 Forbidden 不讓別人連線,所以別人連我們 server 的 ip 就會被擋下來了,下面的 https server 設定也是一樣

solve refresh 404 issue

最後要解決一個很傻的問題,我之前覺得奇怪,為什麼我在根路由以外的頁面刷新頁面,網站都會回我 404,可是我在網站內點來點去,進不同頁面都很順利啊,是為什麼呢?

後來我才發現 server 設定內不能只定義 location / 要進到哪個頁面,如果要進入任何頁面都沒問題,要設定如下

server{
    listen       443 ssl http2;
    server_name  your_domain_name;

    ssl_certificate      /etc/letsencrypt/live/your_domain_name/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/your_domain_name/privkey.pem;

    location / {
        root   path_of_web_bundle;
        index  index.html index.htm;
        try_files $uri $uri/ /index.html;
    }
}

location / 內最後要設定 try_files $uri $uri/ /index.html;,nginx 才會套用網頁專案內定義的路由表


上一篇
用 Nginx 部署 production back-end server
下一篇
TLS/SSL for MongoDB
系列文
Vue+Django+MongoDB+Nginx 全端開發30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言